package com.product.shiro;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import java.util.Date;

/**
 * TokenUtil
 * JWT
 *  https://blog.csdn.net/qq_37636695/article/details/79265711
 */
public class TokenUtil {

    //签名秘钥，和生成的签名的秘钥一样
    private static final String secret = "secret";
    public static final String Authorization = "Authorization";
    // 过期时间 （24小时）
    private static final Long expTime = 7 * 24 * 60 * 60 * 1000L;
    // 10分钟
//    private static final Long expTime = 60 * 10 * 1000L;

    /**
     * iss: jwt签发者
     * sub: jwt所面向的用户
     * aud: 接收jwt的一方
     * exp: jwt的过期时间，这个过期时间必须要大于签发时间
     * nbf: 定义在什么时间之前，该jwt都是不可用的.
     * iat: jwt的签发时间
     * jti: jwt的唯一身份标识，主要用来作为一次性token,从而回避重放攻击。
     */
    /**
     * 创建jwt
     */
    public static String getToken(String name,String id,String ip) {
        //new一个JwtBuilder，设置jwt的body
        JwtBuilder builder = Jwts.builder();
        //设置签名使用的签名算法和签名使用的秘钥
        builder.signWith(SignatureAlgorithm.HS256,secret);
        //设置jti(JWT ID)：是JWT的唯一标识，根据业务需要，这个可以设置为一个不重复的值，主要用来作为一次性token,从而回避重放攻击。
        builder.setId(id);
        //sub(Subject)：代表这个JWT的主体，即它的所有人，这个是一个json格式的字符串，可以存放什么userid，roldid之类的，作为什么用户的唯一标志。
        builder.setSubject(name);
        builder.setAudience(ip);
        //iat: jwt的签发时间
        builder.setIssuedAt(new Date());
        // setExpiration(exp);  设置过期时间
        builder.setExpiration(new Date(System.currentTimeMillis() + expTime));
        // 开始压缩jwt格式为 xxxxxxxxxxxxxx.xxxxxxxxxxxxxxx.xxxxxxxxxxxxx
        String token = builder.compact();
        return token;
    }

    /**
     * 解密jwt
     */
    public static Claims getTokenBody(String token) {
        // 得到DefaultJwtParser
        Claims body = Jwts.parser()
                //设置签名的秘钥
                .setSigningKey(secret)
                //设置需要解析的jwt
                .parseClaimsJws(token).getBody();
        return body;
    }

    public static String getName(String token) {
        Claims body = getTokenBody(token);
        String id = body.getId();
        return id;
    }
}